#include "linklist.h"

template <typename T>
LinkList<T>::LinkList() // 构造函数：初始化头指针创建一个头结点,方便后续操作
{
    head = new LinkList;  // 创建头结点
    head->next = nullptr; // 初始化头结点的next指针为空
    size = 0;             // 节点个数为0，头结点不计算在内
}

template <typename T>
LinkList<T>::~LinkList() // 析构函数：释放内存
{
    Node *p = head;    // 指向下一个结点
    Node *q = nullptr; // 指向当前结点
    while (p == nullptr)
    {
        q = p;       // 记录当前结点
        p = p->next; // 指向下一个结点
        delete q;
    }
}

template <typename T>
void LinkList<T>::operator=(const LinkList<T> &other) // 拷贝构造
{
    Node *p = other.head->next; // 指向原链表的第一个结点
    Node *q = head;             // 指向新链表的第一个结点
    while (p != nullptr)
    {
        q->data = p->data;  // 拷贝数据
        q->next = new Node; // 创建新结点
        q = q->next;        // 指向下一个新结点
        p = p->next;        // 指向下一个原结点
    }
    size = other.size; // 拷贝节点个数
}

template <typename T>
int LinkList<T>::Size() const // 返回节点个数
{
    return size;
}

template <typename T>
bool LinkList<T>::Empty() const // 判断链表是否为空
{
    if (size == 0)
        return true;
    else
        return false;
    /*
    if(head->next == nullptr) // 头结点的next指针为空，说明链表为空
        return true;
    else
        return false;
    */
}

template <typename T>
typename LinkList<T>::Node &LinkList<T>::Front() // 获取链表头结点
{
    return *head->next; // 头结点的next指针指向首元结点
}
template <typename T>
typename LinkList<T>::Node &LinkList<T>::Back() // 获取链表尾结点
{
    // 通过遍历链表获取尾结点
    Node *p = head; // 指向当前结点
    while (p->next != nullptr)
    {
        p = p->next; // 指向下一个结点
    }
    return *p; // 指向尾结点
}

template <typename T>
void LinkList<T>::PushFront(const T &data) // 向链表头部插入数据
{
    Node *p = new Node;   // 创建新结点
    p->data = data;       // 赋值数据
    p->next = head->next; // 新结点的next指针指向原链表的首元结点
    head->next = p;       // 头结点的next指针指向新结点
    size++;               // 节点个数加1
}
template <typename T>
void LinkList<T>::PushBack(const T &data) // 向链表尾部插入数据
{

    Node *p = head; // 指向当前结点
    while (p->next != nullptr)
    {
        p = p->next; // 指向下一个结点
    }
    Node *q = new Node; // 创建新结点
    q->data = data;     // 赋值数据
    q->next = nullptr;  // 新结点的next指针指向尾元结点
    p->next = q;        // 尾结点的next指针指向新结点
    size++;             // 节点个数加1
}

template <typename T>
void LinkList<T>::PopFront() // 删除链表头结点
{
    Node *p = head->next; // 指向首元结点
    head->next = p->next; // 头结点的next指针指向原首元结点的next指针
    delete p;             // 释放首元结点内存
    size--;               // 节点个数减1
}

template <typename T>
void LinkList<T>::PopBack() // 删除链表尾结点
{
    Node *p = head; // 指向当前结点
    while (p->next != nullptr)
    {
        p = p->next; // 指向下一个结点
    }
    Node *q = p; // 指向尾结点
    p = p->next; // 指向尾结点的next指针
    delete q;    // 释放尾结点内存
    size--;      // 节点个数减1

    /*
        如果重载了==号以及使用了end指针，则可以直接使用p->next==end指针来找到前一结点，
        delete end; // 删除尾结点内存
        end = p;     // 尾结点的指针指向前一结点
    */
}

template <typename T>
void LinkList<T>::Insert(int index, const T &data) // 在指定位置插入数据
{
}
template <typename T>
void LinkList<T>::Erase(int index) // 删除指定位置的数据
{
}
template <typename T>
T &LinkList<T>::operator[](int index) // 重载[]操作符,获取指定位置的数据
{
}
template <typename T>
const T &LinkList<T>::operator[](int index) const // 重载[]操作符,获取指定位置的数据
{
}
